package net.jgrm.product.service;

import java.util.Map;

/**
 * 商品访问统计服务接口
 * 使用Redis HyperLogLog实现PV/UV统计
 */
public interface IProductViewService {

    /**
     * 记录商品访问
     *
     * @param productId      商品ID
     * @param userIdentifier 用户标识（IP地址、用户ID等）
     * @param sessionId      会话ID（用于PV统计）
     */
    void recordProductView(Long productId, String userIdentifier, String sessionId);

    /**
     * 获取商品的PV（页面访问量）
     *
     * @param productId 商品ID
     * @return PV数量
     */
    Long getProductPV(Long productId);

    /**
     * 获取商品的UV（独立访客数）
     *
     * @param productId 商品ID
     * @return UV数量
     */
    Long getProductUV(Long productId);

    /**
     * 获取商品的完整访问统计信息
     *
     * @param productId 商品ID
     * @return 包含PV和UV的统计信息
     */
    Map<String, Object> getProductViewStats(Long productId);

    /**
     * 获取多个商品的PV统计
     *
     * @param productIds 商品ID列表
     * @return 商品ID到PV的映射
     */
    Map<Long, Long> getBatchProductPV(Long... productIds);

    /**
     * 获取多个商品的UV统计
     *
     * @param productIds 商品ID列表
     * @return 商品ID到UV的映射
     */
    Map<Long, Long> getBatchProductUV(Long... productIds);

    /**
     * 清空商品的访问统计
     *
     * @param productId 商品ID
     */
    void clearProductViewStats(Long productId);

    /**
     * 获取今日商品访问统计
     *
     * @param productId 商品ID
     * @return 今日PV和UV统计
     */
    Map<String, Object> getTodayProductViewStats(Long productId);

    /**
     * 合并多个时间段的访问统计
     *
     * @param productId 商品ID
     * @param dates     日期列表（格式：yyyy-MM-dd）
     * @return 合并后的统计结果
     */
    Map<String, Object> mergeProductViewStats(Long productId, String... dates);
}